// 对数组本身有影响的原型方法

const numbers = [ 2 , 1 , 5 , 4 , 9 , 7 , 3 , 6 , 8 ];

// 定义一个用来比较两个数值大小的函数
// 如果第一个数大于、等于、小于第二个数，则分别返回 大于零、等于零、小于零的整数
const compare = (first,second)=>{
    if( first > second ) {
        return 1 ;
    } else if( first == second ) {
        return 0 ;
    } else {
        return -1 ;
    }
}

console.log( numbers.toString() );

/*
for(let i = 0 ; i < numbers.length ; i++){
    for(let j = 0 ; j < numbers.length - 1 - i ; j++ ){
        if( compare( numbers[j] , numbers[j+1]) > 0 ){
            let temp = numbers[ j ] ;
            numbers[ j ] = numbers[ j + 1 ];
            numbers[ j + 1 ] = temp ;
        }
    }
}
*/

// Array.prototype.sort( [compare] ) 对数组中所有元素进行排序
numbers.sort( compare );

console.log( numbers.toString() );

// Array.prototype.reverse() 翻转数组
numbers.reverse();

console.log( numbers.toString() );

// 从原数组中删除指定位置及其之后的元素，并以数组形式返回这些被删除的元素
let deleted = numbers.splice( 6 );
console.log( 'deleted: ' , deleted.toString() );
console.log( 'length: ' , numbers.length ,  ' , numbers: ' , numbers.toString() );

// 从原数组中删除指定位置之后的指定数量的元素
deleted = numbers.splice( 2 , 1 ); // ( start , deleteCount )
console.log( 'deleted: ' , deleted.toString() );
console.log( 'length: ' , numbers.length ,  ' , numbers: ' , numbers.toString() );

// 从原数组中删除指定位置之后的指定数量的元素
deleted = numbers.splice( -2 , 1 ); // ( start , deleteCount )
console.log( 'deleted: ' , deleted.toString() );
console.log( 'length: ' , numbers.length ,  ' , numbers: ' , numbers.toString() );


// 从原数组中删除指定位置之后的指定数量的元素后，在该位置插入新的元素
deleted = numbers.splice( 1 , 2 , 123 , 456 ); // ( start , deleteCount , ...items )
console.log( 'deleted: ' , deleted.toString() );
console.log( 'length: ' , numbers.length ,  ' , numbers: ' , numbers.toString() );

// 从原数组中删除指定位置之后的指定数量的元素后，在该位置插入新的元素
deleted = numbers.splice( 1 , 0 , 666 , 888 ); // ( start , deleteCount , ...items )
console.log( 'deleted: ' , deleted.toString() );
console.log( 'length: ' , numbers.length ,  ' , numbers: ' , numbers.toString() );

const names = [];
console.log( names.length , ' , ' , names );
// 与 Java 语言不同，JavaScript 中的数组长度是可以修的
names.length = 10 ;
console.log( names.length , ' , ' , names );

// Array.prototype.fill( value [ , start [ , end ] ] )
names.fill( '小王' );
console.log( names.length , ' , ' , names );

names.fill( '小姜' , 2 );
console.log( names.length , ' , ' , names );

names.fill( '小赵' , 3 , 6 );
console.log( names.toString() );

// 总结:
// 1、Array.prototype.sort( [compare] ) 用原地算法对数组的元素进行排序，并返回数组。
//    默认排序顺序是在将元素转换为字符串，然后比较它们的UTF-16代码单元值序列时构建的
// 2、Array.prototype.reverse() 将数组中元素的位置颠倒，并返回该数组
// 3、Array.prototype.splice( start [ , deleteCount , ...items ])  
//    通过删除或替换现有元素或者原地添加新的元素来修改数组,并以数组形式返回被修改的内容。此方法会改变原数组。
// 4、Array.prototype.fill( value [ , start [ , end ] ] ) 用 value 填充数组中 [ start , end ) 之间的位置
//    用一个固定值填充一个数组中从起始索引到终止索引内的全部元素。不包括终止索引